package com.hss.recyclerviewtest.tangram;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;

import com.hss.recyclerviewtest.R;
import com.hss.recyclerviewtest.tangram.data.DEBUG;
import com.hss.recyclerviewtest.tangram.data.VVTEST;
import com.hss.recyclerviewtest.tangram.support.SampleClickSupport;
import com.hss.recyclerviewtest.tangram.support.SampleScrollSupport;
import com.hss.recyclerviewtest.tangram.views.RatioTextView;
import com.hss.recyclerviewtest.tangram.views.SimpleImgView;
import com.hss.recyclerviewtest.tangram.views.TestView;
import com.squareup.picasso.Picasso;
import com.tmall.wireless.tangram.TangramBuilder;
import com.tmall.wireless.tangram.TangramEngine;
import com.tmall.wireless.tangram.util.IInnerImageSetter;

import org.json.JSONArray;
import org.json.JSONException;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TangramActivity extends AppCompatActivity {
    RecyclerView rcv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rcv = findViewById(R.id.rcv);


        //初始化 Tangram 环境

       /* 应用全局只需要初始化一次，提供一个通用的图片加载器，
        一个应用内通用的ImageView类型（通常情况下每个应用都有自定义的 ImageView，如果没有的话就提供系统的
        ImageView 类）。*/
        TangramBuilder.init(getApplicationContext(), new IInnerImageSetter() {
            @Override
            public <IMAGE extends ImageView> void doLoadImageUrl(@NonNull IMAGE view,
                                                                 @Nullable String url) {
                //假设你使用 Picasso 加载图片
                 Picasso.with(getApplicationContext()).load(url).into(view);
            }
        }, ImageView.class);

        //3.初始化 TangramBuilder
//        在 Activity 中初始化TangramBuilder，假设你的 Activity 是TangramActivity。
        TangramBuilder.InnerBuilder builder = TangramBuilder.newInnerBuilder(TangramActivity.this);
//        4.注册自定义的卡片和组件
        builder.registerCell("testView", TestView.class);
        builder.registerCell("singleImgView", SimpleImgView.class);
        builder.registerCell("ratioTextView", RatioTextView.class);

//        builder.registerVirtualView("vvtest");

        //5.生成TangramEngine实例
        TangramEngine engine = builder.build();
        //6.绑定业务 support 类到 engine
//        engine.setVirtualViewTemplate(VVTEST.BIN);
//        engine.setVirtualViewTemplate(DEBUG.BIN);



//        engine.getService(VafContext.class).setImageLoaderAdapter(new IImageLoaderAdapter() {
//
//            private List<ImageTarget> cache = new ArrayList<ImageTarget>();
//
//            @Override
//            public void bindImage(String uri, final ImageBase imageBase, int reqWidth, int reqHeight) {
//                RequestCreator requestCreator = Picasso.with(TangramActivity.this).load(uri);
//                Log.d("TangramActivity", "bindImage request width height " + reqHeight + " " + reqWidth);
//                if (reqHeight > 0 || reqWidth > 0) {
//                    requestCreator.resize(reqWidth, reqHeight);
//                }
//                ImageTarget imageTarget = new ImageTarget(imageBase);
//                cache.add(imageTarget);
//                requestCreator.into(imageTarget);
//            }
//
//            @Override
//            public void getBitmap(String uri, int reqWidth, int reqHeight, final Listener lis) {
//                RequestCreator requestCreator = Picasso.with(TangramActivity.this).load(uri);
//                Log.d("TangramActivity", "getBitmap request width height " + reqHeight + " " + reqWidth);
//                if (reqHeight > 0 || reqWidth > 0) {
//                    requestCreator.resize(reqWidth, reqHeight);
//                }
//                ImageTarget imageTarget = new ImageTarget(lis);
//                cache.add(imageTarget);
//                requestCreator.into(imageTarget);
//            }
//        });
  /*      Tangram 内部提供了一些常用的 support 类辅助业务开发，业务方也可以自定义所需要的功能模块注册进去。
        以下常用三个常用的support，分别处理点击、卡片数据加载、曝光逻辑，详情请参考文档。*/

//        engine.register(SimpleClickSupport.class, new XXClickSupport());
//        engine.register(CardLoadSupport.class, new XXCardLoadSupport());
//        engine.register(ExposureSupport.class, new XXExposureSuport());



        engine.addSimpleClickSupport(new SampleClickSupport());


        engine.enableAutoLoadMore(true);


//        7.绑定 recyclerView
        engine.bindView(rcv);

//        8.监听 recyclerView 的滚动事件

        rcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //在 scroll 事件中触发 engine 的 onScroll，内部会触发需要异步加载的卡片去提前加载数据
//                engine.onScrolled();
            }
        });

//        9.设置悬浮类型布局的偏移（可选）

//        如果你的 recyclerView 上方还覆盖有其他 view，比如底部的 tabbar 或者顶部的 actionbar，
// 为了防止悬浮类 view 和这些外部 view 重叠，可以设置一个偏移量。

        engine.getLayoutManager().setFixOffset(0, 40, 0, 0);


//        10.设置卡片预加载的偏移量（可选）

//        在页面滚动过程中触发engine.onScrolled()方法，会去寻找屏幕外需要异步加载数据的卡片，
// 默认往下寻找5个，让数据预加载出来，可以修改这个偏移量。

        engine.setPreLoadNumber(3);

//        11.加载数据并传递给 engine
//
//        数据一般是调用接口加载远程数据，这里演示的是 mock 加载本地的数据：

        String json = new String(getAssertsFile(this, "data.json"));
        JSONArray data = null;
        try {
            data = new JSONArray(json);
//            engine.setData(data);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        engine.register(SampleScrollSupport.class, new SampleScrollSupport(rcv));


    }

    public static byte[] getAssertsFile(Context context, String fileName) {
        InputStream inputStream = null;
        AssetManager assetManager = context.getAssets();
        try {
            inputStream = assetManager.open(fileName);
            if (inputStream == null) {
                return null;
            }

            BufferedInputStream bis = null;
            int length;
            try {
                bis = new BufferedInputStream(inputStream);
                length = bis.available();
                byte[] data = new byte[length];
                bis.read(data);

                return data;
            } catch (IOException e) {

            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (Exception e) {

                    }
                }
            }

            return null;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}
